home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume90
/
util
/
prtfonts
/
part01
/
PrintFonts.c
next >
Wrap
C/C++ Source or Header
|
1990-07-08
|
10KB
|
312 lines
/*PrintFonts V1.11 (c)1989,1990 by Dave Schreiber. All rights reserved*/
/*Must be freely distributed, except for shipping, copying, media, and*/
/*related costs.*/
/*V1.00 finished August 30, 1989 */
/*V1.10 finished January 21, 1990 */
/*V1.11 finished May 14, 1990 */
/* New features: can print in more than one column
can determine the maximum number of columns to use
can print an alternate description of a font
(good for use with unreadable fonts like
Cairo or Music).
Aborts if it can't print out a page of fonts (V1.11)
*/
/*Compiled using Lattice C V5.04*/
#include "setup.h"
int InterpretArgs();
WORD PrintPage();
DumpWindowToPrinter();
main(argc,argv)
int argc;
char *argv[];
{
struct AvailFontsHeader *afh;
ULONG afhsize; /*Size of AvailFontsHeader buffer*/
ULONG numfonts,curfont;
BYTE max,readable,both;
WORD columns;
WORD maxlen;
struct AvailFonts *af;
if(argc==2 && argv[1][0]=='?') /*User wants help*/
{
puts("PrintFonts V1.11");
puts("(c)1989, 1990 by Dave Schreiber. All rights reserved.");
puts("Format for use:");
puts(" 1> PrintFonts [options]");
puts("Where options are any of the following:");
puts(" -r: Print each font's name in a readable format");
puts(" -c#: Use # number of columns");
puts(" -m: Determine the max number of columns that can be");
puts(" used and do not print.");
puts(" -b: Determines the maximum number of columns and");
puts(" prints using that number of columns");
exit(0);
}
/*Parse the command line arguments and set the appropriate flags*/
if(!InterpretArgs(argc,argv,&max,&readable,&columns,&both))
exit(1000);
if(columns<1)
{
puts("You must have at least one column!");
exit(2000);
}
startup(); /*Open Libraries, etc.*/
afhsize=AvailFonts(NULL,NULL,AFF_MEMORY|AFF_DISK);
afh=(struct AvailFontsHeader *)AllocMem(afhsize,MEMF_CLEAR);
/*Gets a buffer large enough to hold all the font information*/
/*(AvailFonts(0,0,[type]) returns the amount of memory needed*/
/*to hold the information for all the fonts of type [type]) */
if(afh==NULL) /*Could't allocate the memory*/
{
closeup();
ExitProg("Couldn't allocate enough memory!");
}
AvailFonts(afh,afhsize,0xff); /*Get the info for fonts*/
TopazAttr.ta_Name="topaz.font"; /*Topaz is used if the user wants*/
TopazAttr.ta_YSize=8; /*'readable' font names*/
TopazAttr.ta_Style=0;
TopazAttr.ta_Flags=FPF_ROMFONT|FPF_DISKFONT;
if((Topaz=(struct TextFont *)OpenFont(&TopazAttr))==NULL)
{
FreeMem(afh,afhsize);
closeup();
ExitProg("Can't open Topaz 8 point font!!!!!!!!!!!!");
}
numfonts=afh->afh_NumEntries; /*Get the number of fonts*/
curfont=1; /*First font*/
af=(struct AvailFonts *)&afh[curfont];
while(curfont <= numfonts)
maxlen=PrintPage(&curfont,numfonts,af,columns,max,readable);
maxlen=MAX_X/maxlen;
if(maxlen < 1)
maxlen=1;
if(max) /*If just finding the max length*/
{
printf("These fonts can be printed in %d column",maxlen);
if(maxlen==1)
printf(".\n");
else
printf("s.\n");
}
if(both) /*If -b switch, do it again, but print this time*/
{
curfont=1;
af=(struct AvailFonts *)&afh[curfont];
while(curfont <= numfonts)
PrintPage(&curfont,numfonts,af,maxlen,FALSE,readable);
}
FreeMem(afh,afhsize); /*Free up the allocated memory*/
CloseFont(Topaz);
closeup();
}
int InterpretArgs(argc,argv,max,readable,cols,both)
int argc;
char *argv[];
BYTE *max,*readable,*both;
WORD *cols;
{
BYTE c;
int columns;
*cols=1; /*Load in some defaults*/
*max=FALSE;
*readable=FALSE;
*both=FALSE;
for (c=1;c<argc;c++) /*For each argument*/
switch(argv[c][1]) /*Letter after the slash*/
{
case 'b': /*For -b switch, set both*/
case 'B':
*both=TRUE; /*AND max*/
case 'm': /*Max columns mode*/
case 'M': /*Just in case the user typed -T instead of -t*/
*max=TRUE;
break;
case 'r': /*Readable*/
case 'R':
*readable=TRUE;
break;
case 'c': /*Number of columns*/
case 'C':
if(argv[c][2]==NULL)
break;
stcd_i(&argv[c][2],&columns); /*Convert text to #*/
*cols=columns;
break;
default:
puts("I don't understand option:");
puts(argv[c]);
return(FALSE);
}
return(TRUE);
}
/*Setup and print a page of fonts*/
WORD PrintPage(curfont,numfonts,af,cols,findmax,readable)
ULONG *curfont;
ULONG numfonts;
struct AvailFonts *af;
BYTE findmax,readable;
WORD cols;
{
#define FLAGS af->af_Attr.ta_Flags
#define Rp Wdw->RPort
BYTE Full=FALSE;
USHORT TextY=STARTINGROW; /*Current Y coordinate*/
USHORT LastY; /*Last Y coordinate*/
static WORD max=0;
WORD length;
WORD column,StartX;
WORD ColWidth;
char Master[256],fontstr[256],SizeStr[6],*string;
struct TextFont *tf;
struct TextAttr TFont;
ColWidth=MAX_X/cols; /*Get the # of pixels in each column*/
string = (char *)&Master[1]; /*Initialize a pointer and*/
Master[0]='('; /*a string*/
SetAPen(Rp,0);
RectFill(Rp,0,0,MAX_X-1,MAX_Y-1);
SetAPen(Rp,1);
ClearScreen(Rp); /*Clear the bitmap*/
af+=(*curfont-1);
for(column=StartX=0;column<cols && *curfont <= numfonts;
StartX=(++column*ColWidth)) /*Loop for each column*/
{
TextY=STARTINGROW;
Full=FALSE;
while(!Full && (*curfont <= numfonts))
{
/*If the font is: not removed, goes from left to right*/
/*and is EITHER a disk or memory font, do nothing.*/
/*(This is partly from the RKM)*/
if((af->af_Attr.ta_Style==0) &&
!( ((FLAGS & FPF_REMOVED)||(FLAGS & FPF_REVPATH) ||
((FLAGS & FPF_DISKFONT) && (af->af_Type & AFF_MEMORY))) ) )
if((af->af_Attr.ta_YSize) < (MAX_Y-(4+TextY))) /*If it'll fit...*/
{
TFont.ta_Name=(char *)af->af_Attr.ta_Name; /*Get the name*/
TFont.ta_YSize=af->af_Attr.ta_YSize; /*Get the size*/
TFont.ta_Style=af->af_Attr.ta_Style; /*Plain style*/
TFont.ta_Flags=FPF_ROMFONT|FPF_DISKFONT|
FPF_PROPORTIONAL|FPF_DESIGNED; /*Straight from RKM*/
if((tf=(struct TextFont *)OpenDiskFont(&TFont))!=NULL)
{
/*Position 'cursor' at baseline*/
TextY+=(LastY=(tf->tf_Baseline));
strcpy(fontstr,af->af_Attr.ta_Name);
strcpy(string,fontstr); /*Get font name*/
string[strlen(string)-5]=NULL;
strcat(string," "); /*Tack on a space*/
stcu_d(SizeStr,af->af_Attr.ta_YSize); /*Get the size in chars*/
strcat(string,SizeStr);
strcat(string," ");
Move(Rp,StartX,TextY);
SetFont(Rp,tf); /*Set the font*/
Text(Rp,string,strlen(string)); /*Print the font info*/
/*Get the length of the text string in pixels*/
length=TextLength(Rp,string,strlen(string));
if(readable) /*If -r switch...*/
{
Master[strlen(Master)-1]=')';
SetFont(Rp,Topaz);
Text(Rp,Master,strlen(Master));
length+=TextLength(Rp,Master,strlen(Master));
}
if(length > max)
max=length; /*And store in max if the biggest*/
/*Add decender area to height*/
TextY+=(LastY=(tf->tf_YSize-tf->tf_Baseline+2));
CloseFont(tf); /*Close the font*/
}
(*curfont)++;
af++;
}
else
Full = TRUE;
else
{
(*curfont)++;
af++;
}
}
}
if(!findmax) /*Print fonts if -m switch isn't set*/
if((DumpWindowToPrinter(Wdw,printerMsg,
(TextY+LastY>MAX_Y ? MAX_Y : TextY+LastY))) != 0)
{
puts("Printer error! Aborting!");
*curfont=numfonts+1; /*An error occured, so abort*/
}
/*Add a little for serifs, but not more than MAX_Y*/
return(max); /*And return the max text length*/
}
DumpWindowToPrinter(Wdw,request,LastY)
struct Window *Wdw;
union printerIO *request;
USHORT LastY;
{
struct ViewPort *Vp;
char FormFeed[2];
FormFeed[0]=0x0c; /*Form feed character*/
FormFeed[1]=NULL; /*NULL terminator*/
Vp=&Wdw->WScreen->ViewPort;
/*Set up for dumping the rastport*/
request->iodrp.io_Command=PRD_DUMPRPORT;
request->iodrp.io_RastPort=Rp;
request->iodrp.io_ColorMap=Vp->ColorMap;
request->iodrp.io_Modes=Vp->Modes;
request->iodrp.io_SrcX=0;
request->iodrp.io_SrcY=0;
request->iodrp.io_SrcWidth=MAX_X;
request->iodrp.io_SrcHeight=MAX_Y;
request->iodrp.io_DestCols=0;
request->iodrp.io_DestRows=0;
request->iodrp.io_Special=SPECIAL_FULLCOLS|
SPECIAL_FULLROWS;
return(DoIO(request)); /*Do the actual dump*/
}